跳到主要内容

Iframe渲染和通信

  • 背景
    • 将gpt返回的html内容,通过iframe嵌入到页面中,实现渲染
    • 希望能在页面中hover、点击iframe内部元素时,能够高亮显示、选中元素
    • 但不希望在iframe内部可以获取到父级页面的元素和信息,保证安全性
  • 策略
    • 通过iframe的srcdoc属性,将html内容渲染到iframe中
    • 将iframe的sandbox属性设置为 allow-script,运行运行script,保证iframe内部无法获取到父级页面的信息
    • 将希望给iframe内部元素添加事件监听的需求,通过iframe的postMessage方法,将事件传递给iframe内部
    • iframe内部监听事件,根据事件类型,添加对应的事件监听
    • 具体实现如下:
  • 实现
    • 父级页面
  const iframe = document.createElement('iframe
iframe.srcdoc = htmlContent
iframe.sandbox = 'allow-scripts'
document.body.appendChild(iframe)
iframe.contentWindow.postMessage({type: 'addEvent', eventType: 'click'}, '*')
  • iframe内部
window.addEventListener('message', (event) => {
const {type, eventType} = event.data
if (type === 'addEvent') {
document.body.addEventListener(eventType, (e) => {
console.log('click', e.target)
})
}
})
  • 总结
  • 通过iframe的srcdoc属性,将html内容渲染到iframe中,通过sandbox属性,保证iframe内部无法获取到父级页面的信息,通过postMessage方法,将事件传递给iframe内部,实现了在iframe内部添加事件监听的需求